( ** StarField Sprite Demo ** )
VARIABLE RND HERE RND ! ( seed )
VARIABLE StringSpace
82 CHARS ALLOT 			( create a string buffer )
StringSpace 84 32 FILL 	( initialise it to ASCII 32 )
S" The Power Of Forth!" ( addr len )
StringSpace 			( addr len addr )
SWAP 					( addr addr len )
CMOVE> 					( move string into buffer )
0 VALUE FlipFlop
( ascii codes for small, medium, and big stars )
256 CONSTANT Sml* 
257 CONSTANT Med* 
258 CONSTANT Big*


( keyboard codes )
CHAR E CONSTANT KeyE CHAR S CONSTANT KeyS
CHAR D CONSTANT KeyD CHAR X CONSTANT KeyX
( define colours )
15 CONSTANT White
9  CONSTANT TEN
( set up user defined graphics for the 3 star sizes )
: UDG $8000    0  0 0 4 Sml* DCHAR ( define small star )
      $40E0 $4000 0 0 4 Med* DCHAR ( define medium star )
      $70F8 $F870 0 0 4 Big* DCHAR ( define large star ) ;
( generate a random Y coordinate )
: RndY 180 RND ;
( generate a random X coordinate )
: RndX 256 RND ;

( set up our sprites. 10 small, 10 medium, 10 large )
: 10Small TEN FOR I       RndY RndX 0 White SPRITE NEXT ;
: 10Med   TEN FOR I 10 +  RndY RndX 1 White SPRITE NEXT ;
: 10Big   TEN FOR I 20 +  RndY RndX 2 White SPRITE NEXT ;
( set up the sprite movement list for each direction )
: GoLeft  TEN FOR I       0 -1 SPRVEC NEXT 
          TEN FOR I 10 +  0 -2 SPRVEC NEXT 
		  TEN FOR I 20 +  0 -3 SPRVEC NEXT ;
: GoRight TEN FOR I       0  1 SPRVEC NEXT 
          TEN FOR I 10 +  0  2 SPRVEC NEXT 
		  TEN FOR I 20 +  0  3 SPRVEC NEXT ;
: GoUp    TEN FOR I      -1  0 SPRVEC NEXT 
          TEN FOR I 10 + -2  0 SPRVEC NEXT 
		  TEN FOR I 20 + -3  0 SPRVEC NEXT ;

: GoDown  TEN FOR I       1  0 SPRVEC NEXT 
          TEN FOR I 10 +  2  0 SPRVEC NEXT 
		  TEN FOR I 20 +  3  0 SPRVEC NEXT ;
: Delay 100 FOR NEXT ;
: DoFlipFlop FlipFlop NOT DUP TO FlipFlop ;
: ScanKeys  KEY? CASE 
    KeyE OF GoUp    ENDOF  KeyS OF GoLeft  ENDOF
	KeyD OF GoRight ENDOF  KeyX OF GoDown  ENDOF
   ENDCASE BREAK? ;
: Scroll DoFlipFlop IF [ StringSpace 83 + LITERAL ] C@
    [ StringSpace LITERAL StringSpace 1+ LITERAL ] 83 CMOVE>
    [ StringSpace LITERAL ] C!
    0  0 GOTOXY [ StringSpace 32 + LITERAL ] 31 TYPE
    0 23 GOTOXY [ StringSpace 32 + LITERAL ] 31 TYPE
	ScanKeys THEN ;
: Setup 1 GMODE  0 SCREEN  UDG  10Small 10Med 10Big GoRight ;
: GO Setup BEGIN 0 30 SPRMOV Scroll Delay AGAIN ;
 